/**
 *
 *  Copyright (c) 2011, AstroDAbis
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *      * Redistributions of source code must retain the above copyright notice,
 *        this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above copyright notice,
 *        this list of conditions and the following disclaimer in the documentation
 *        and/or other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package org.jiscinvolve.astrodabis.barberry.control.services;

import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.context.request.WebRequest;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import org.jiscinvolve.astrodabis.barberry.control.Paths;
import org.jiscinvolve.astrodabis.barberry.control.ObjectData;
import org.jiscinvolve.astrodabis.barberry.control.RequestData;
import org.jiscinvolve.astrodabis.barberry.control.BaseController;

import org.jiscinvolve.astrodabis.barberry.common.core.Account;

import org.jiscinvolve.astrodabis.barberry.common.data.TapTable;
import org.jiscinvolve.astrodabis.barberry.common.data.TapService;

import org.jiscinvolve.astrodabis.barberry.common.core.Identifier;
import org.jiscinvolve.astrodabis.barberry.common.core.Identified;
import org.jiscinvolve.astrodabis.barberry.common.core.SimpleIdent;

import org.jiscinvolve.astrodabis.barberry.common.core.exception.*;

/**
 * Service details controller.
 *
 */
@Controller
@RequestMapping(Paths.SERVICE_LISTING)
public class ServicesController
extends BaseController
    {

    /**
     * Our debug logger.
     * 
     */
    private static Log log = LogFactory.getLog(ServicesController.class);

    /**
     * Service details page.
     * 
     */
    public static final String SERVICE_PAGE = "services/service-list" ;

    /**
     * Get request.
     * 
     */
	@RequestMapping(method=RequestMethod.GET)
	public ModelAndView page(
	    ModelAndView model
	    ){
		model.setViewName(
		    SERVICE_PAGE
		    );
        return model ;
        }


    /**
     * JSON get request for list of servics.
     * e.g. http://localhost:8080/astrodabis/spring/services/json
     *
     */
	@RequestMapping(value="/json", method=RequestMethod.GET)
	public @ResponseBody Iterator<JsonServiceBean> jsonServicesList()
	    {
        final Iterator<TapService> iter = womble.services().select().iterator();
        return new Iterator<JsonServiceBean>()
            {
            public JsonServiceBean next()
                {
                return new JsonServiceBean(
                    iter.next()
                    );
                }
            public boolean hasNext()
                {
                return iter.hasNext();
                }
            public void remove()
                {
                iter.remove();
                }
            };
        }

    public static class JsonServiceBean
        {
        private TapService service ;
        public JsonServiceBean(TapService service)
            {
            this.service = service ;
            }
        public String getIdent()
            {
            return service.ident().value().toString();
            }
        public String getName()
            {
            return service.name();
            }
        public String getIvorn()
            {
            if (null != service.ivorn())
                {
                return service.ivorn().toString();
                }
            else {
                return "" ;
                }
            }
        }
    }

